<?php

class DepartamentoController extends Zend_Controller_Action
{
    public function init()
    {
       if (X\CheckAccess::Controller()) return;

        $this->em = Zend_Registry::getInstance()->entitymanager;
    }

    //--------------------------------//
    //             PAGINA             //
    //--------------------------------//

    public function crearAction()
    {
        if (X\CheckAccess::PageAction('Departamento.crear')) return;

        // obtener los datos
            $departamentos = $this->em->createQueryBuilder()
                    ->select         ('d.codigoDepartamento')
                    ->addselect      ('d.nombreDepartamento')
                    ->from           ('Default_Model_Departamento', 'd')
                    ->where          ('d.isDepartment = TRUE')
                    ->orderBy        ('d.nombreDepartamento', 'asc')
                    ->getQuery       ()
                    ->execute        ();

        // convertir a json
            $this->view->jsonDepartamentos = Zend_Json::encode(Array(
                "success" => true,
                "total"   => count($departamentos),
                "rows"    => $departamentos
            ));

    }

    public function editarAction()
    {
        if (X\CheckAccess::PageAction('Departamento.editar')) return;

        try{
            // obtener los parametros
            $id = $this->_request->getQuery('id');

            // obtener los datos
            $this->view->departamento = $this->em->find('Default_Model_Departamento', $id);
            
            // obtener los datos
            $departamentos = $this->em->createQueryBuilder()
                    ->select         ('d.codigoDepartamento')
                    ->addselect      ('d.nombreDepartamento')
                    ->from           ('Default_Model_Departamento', 'd')
                    ->where          ('d.isDepartment = TRUE')
                    ->orderBy        ('d.nombreDepartamento', 'asc')
                    ->getQuery       ()
                    ->execute        ();

            // convertir a json
            $this->view->jsonDepartamentos = Zend_Json::encode(Array(
                "success" => true,
                "total"   => count($departamentos),
                "rows"    => $departamentos
            ));

        }
        catch(Exception $e){
            $this->view->error = 'Error al cargar el departamento.';
        }
    }

    public function listarAction()
    {
        if (X\CheckAccess::PageAction('Departamento.listar')) return;

        try{
            // permisos
            if (X\Session::esSysAdmin()) $where = 'd.isDepartment=true';
            else                         $where = '1=1';


            // obtener los datos
            $departamentos = $this->em->createQueryBuilder()
                    ->select         ('d.codigoDepartamento')
                    ->addselect      ('d.nombreDepartamento')
                    ->addselect      ('d.telefono')
                    ->addselect      ('d.email')
                    ->addselect      ('d.cajaChica')
                    ->addselect      ('p.nombreDepartamento as pname')
                    ->from           ('Default_Model_Departamento', 'd')
                    ->leftJoin       ('d.padre',  'p')
                    ->where          ($where)
                    ->orderBy        ('d.nombreDepartamento', 'asc')
                    ->setFirstResult (0)
                    ->setMaxResults  (20)
                    ->getQuery       ()
                    ->execute        ();

            $cantidad = $this->em->createQueryBuilder()
                    ->select   ('count(d.codigoDepartamento)')
                    ->from     ('Default_Model_Departamento', 'd')
                    ->getQuery ()
                    ->getSingleScalarResult();

            // convertir a json
            $this->view->jsondata = Zend_Json::encode(Array(
                "success" => true,
                "total"   => $cantidad,
                "rows"    => $departamentos
            ));
        }
        catch(Exception $e){
            $this->view->error = 'Error al cargar los departamentos.';
        }
    }

    //--------------------------------//
    //              AJAX              //
    //--------------------------------//

    public function ajaxCrearAction()
    {
        if (X\CheckAccess::AjaxAction($this, 'Departamento.crear')) return;

        try{
            // obtener los parametros
            $nombreDepartamento = $this->_request->getPost('nombreDepartamento');
            $padre              = $this->_request->getPost('codigoDepartamento');
            $cajaChica          = $this->_request->getPost('cajaChica');
            $email              = $this->_request->getPost('email');
            $telefono           = $this->_request->getPost('telefono');
            $director           = $this->_request->getPost('director');

             // verificar
            $cantidad = $this->em->createQueryBuilder()
                ->select   ('count(d.codigoDepartamento)')
                ->from     ('Default_Model_Departamento', 'd')
                ->where    ("d.nombreDepartamento='".pg_escape_string($nombreDepartamento)."'")
                ->getQuery ()
                ->getSingleScalarResult();

            if ($cantidad > 0){
                X\Msg::Failure('Ya existe un departamento con este nombre.');
                return;
            }

            // crear
            $departamento = new Default_Model_Departamento;
            $departamento->setNombreDepartamento($nombreDepartamento);
            if($cajaChica) $departamento->setCajaChica         ($cajaChica);
            else $departamento->setCajaChica         (null);
            $departamento->setEmail             ($email);
            $departamento->setTelefono          ($telefono);
            $departamento->setDirector          ($director);
            
            if (X\Session::esSysAdmin()){
                $departamento->setIsDepartment(true);
                $departamento->setPadre($departamento);
            }
            else{
                $departamento->setIsDepartment(false);
                //traer padre
                $dptoPadre = $this->em->find('Default_Model_Departamento', $padre);
                //set padre
                $departamento->setPadre($dptoPadre);
            }

            // guardar
            $this->em->persist($departamento);
            $this->em->flush();

            X\Msg::Success('El departamento se ha creado con éxito.');
        }
        catch(Exception $e){
            X\Msg::Failure('Error al crear el departamento.'.$e->getMessage());
        }
    }

    public function ajaxEditarAction()
    {
        if (X\CheckAccess::AjaxAction($this, 'Departamento.editar')) return;

        try{
            // obtener los parametros
            $codigoDepartamento = $this->_request->getPost('codigoDepartamento');
            $nombreDepartamento = $this->_request->getPost('nombreDepartamento');
            $padre              = $this->_request->getPost('codigoPadre');
            $cajaChica          = $this->_request->getPost('cajaChica');
            $email              = $this->_request->getPost('email');
            $telefono           = $this->_request->getPost('telefono');
            $director           = $this->_request->getPost('director');

            // verificar
            $cantidad = $this->em->createQueryBuilder()
                    ->select   ('count(d.codigoDepartamento)')
                    ->from     ('Default_Model_Departamento', 'd')
                    ->where    ("d.nombreDepartamento='".pg_escape_string($nombreDepartamento)."'")
                    ->andWhere ("d.codigoDepartamento<>'$codigoDepartamento'")
                    ->getQuery ()
                    ->getSingleScalarResult();

            if ($cantidad > 0){
                X\Msg::Failure('Ya existe un departamento con este nombre.');
                return;
            }

            // obtener y modificar el objeto
            $departamento = $this->em->find('Default_Model_Departamento', $codigoDepartamento);

            //verificar si es centro de costos, en caso de ser así, verificar si esta asociado a alguna cuenta
            //y si esta tiene asociada algún movimiento
            //if( !$departamento->getIsDepartment() ){
                $cuentas = $this->em->createQueryBuilder()
                    ->select         ('c')
                    ->from           ('Default_Model_Cuenta', 'c')
                    ->where          ('c.centroCostos = '.$departamento->getCodigoDepartamento())
                    ->getQuery       ()
                    ->execute        ();

                foreach($cuentas as $c){
                    if( count($c->getMovimientos())>0 ){
                        X\Msg::Failure('El departamento esta asociado a una cuenta ya con movimientos. '.
                                       'No puede modificar la caja chica ni el departamento que pertenece');
                        return;
                    }
                }
            //}

            $departamento->setNombreDepartamento($nombreDepartamento);
            if($cajaChica) $departamento->setCajaChica         ($cajaChica);
            else $departamento->setCajaChica         (null);
            $departamento->setEmail             ($email);
            $departamento->setTelefono          ($telefono);
            $departamento->setDirector          ($director);

            //traer padre
            $dptoPadre = $this->em->find('Default_Model_Departamento', $padre);
            //set padre
            $departamento->setPadre($dptoPadre);

            // guardar el objeto
            $this->em->persist($departamento);
            $this->em->flush();

            X\Msg::Success('El departamento se ha guardado con éxito.');
        }
        catch(Exception $e){
            X\Msg::Failure('Error al guardar el departamento.');
        }
    }
    
    public function ajaxEliminarAction()
    {
        if (X\CheckAccess::AjaxAction($this, 'Departamento.eliminar')) return;

        try{
            // obtener los parametros
            $id = $this->_request->getPost('id');

            // verificar
            $cantidad = $this->em->createQueryBuilder()
                    ->select   ('count(u.codigoUsuario)')
                    ->from     ('Default_Model_Usuario', 'u')
                    ->join     ('u.departamento', 'd')
                    ->where    ("d.codigoDepartamento='$id'")
                    ->getQuery ()
                    ->getSingleScalarResult();

            if ($cantidad > 0){
                X\Msg::Failure('El departamento seleccionado está en uso.');
                return;
            }

            // obtener el objeto
            $departamento = $this->em->find('Default_Model_Departamento', $id);

            // guardar el objeto
            $this->em->remove($departamento);
            $this->em->flush();

            X\Msg::Success('El departamento se ha eliminado con éxito.');
        }
        catch(Exception $e){
            X\Msg::Failure('Error al eliminar el departamento.');
        }
    }

    public function ajaxListarAction()
    {
        if (X\CheckAccess::AjaxAction($this, 'Departamento.listar')) return;

        try{
            // obtener los parametros
            $start = $this->_request->getPost("start");
            $limit = $this->_request->getPost("limit");
            $sort  = $this->_request->getPost("sort");
            $dir   = $this->_request->getPost("dir");

            // parametros por defecto
            $sort = isset($sort)? $sort : 'nombreDepartamento';
            $dir  = isset($dir)?  $dir  : 'asc';

            // permisos
            if (X\Session::esSysAdmin()) $where = 'd.isDepartment=true';
            else                         $where = '1=1';

            // obtener los datos
            $departamentos = $this->em->createQueryBuilder()
                    ->select         ('d.codigoDepartamento')
                    ->addselect      ('d.nombreDepartamento')
                    ->addselect      ('d.telefono')
                    ->addselect      ('d.email')
                    ->addselect      ('d.cajaChica')
                    ->addselect      ('p.nombreDepartamento as pname')
                    ->from           ('Default_Model_Departamento', 'd')
                    ->leftJoin       ('d.padre',  'p')
                    ->where          ($where)
                    ->orderBy        ("d.$sort", $dir)
                    ->setFirstResult ($start)
                    ->setMaxResults  ($limit)
                    ->getQuery       ()
                    ->execute        ();

            $cantidad = $this->em->createQueryBuilder()
                    ->select   ('count(d.codigoDepartamento)')
                    ->from     ('Default_Model_Departamento', 'd')
                    ->getQuery ()
                    ->getSingleScalarResult();

            // crear la respuesta en json
            echo Zend_Json::encode(Array(
                "success" => true,
                "total"   => $cantidad,
                "rows"    => $departamentos
            ));
        }
        catch(Exception $e){
            X\Msg::Failure('Error al listar los departamentos.'.$e->getMessage());
        }
    }
}
